25. 矩阵乘法
矩阵乘法
卡尔曼滤波器方程有很多乘法运算。实际上,每个方程都包含一个矩阵乘法运算。
矩阵乘法和矩阵加法或减法不同。在矩阵加法中,我们从第一个矩阵中取出一个元素,在第二个矩阵中找到匹配元素,然后输出总和。
我们也可以在矩阵中将匹配的元素相乘,但这就是所谓的元素乘法。矩阵乘法是完全不同的运算。它编程更加复杂。
矩阵相乘
\mathbf{A}
带有矩阵
\mathbf{B}
的唯一可能性在于,
\mathbf{A}
中的列数等于
\mathbf{B}
中的行数。因此,如果
\mathbf{A}
是
m \times n
,那么
\mathbf{B}
应该是
n \times p
。
m
和
p
的值可以是任意正整数。
\mathbf{A} \times \mathbf{B} 的结果是一个大小为 m \times p 的矩阵。
矩阵乘法的正式定义
以下为两个矩阵相乘的正式公式:
(\mathbf{AB}) {ij} = \sum {k=1}^n a_{ik}b_{kj}
也就是说,要在结果矩阵中找到元素(i,j),就需要
- 取矩阵 A 中的第 i 行,矩阵 B 中的第 j 列
- 在 i 行的 A 向量和 j 列的 B 向量上进行元素相乘
- 结果元素求和
但是,你已经完成了元素的乘法运算,并且将两个向量的结果元素相加。这就是本课向量部分中点积的定义!将矩阵行看作一个向量,将矩阵列看作一个向量;你已经编写过计算点积的代码。
所以,你已经完成了矩阵乘法编程的一部分任务!
我们来看一个具体的例子,了解矩阵乘法的原理。相乘的两个矩阵是:
\begin{bmatrix}17&25&6&2\\6 & 1 & 97 & 4 \\80&8&54&15\end{bmatrix} \times\begin{bmatrix}3&14&1&7&42&5\\32&11&2&4&18&17\\19&81&4&8&5&10\\27&2&3&6&7&3\end{bmatrix}=\begin{bmatrix}1019&1003&97&279&1208&576\\2001&7960&408&846&783&1029\\1927&5612&357&1114&3879&1121\end{bmatrix}
请注意,矩阵 \mathbf{A} 有三行四列 (3 x 4),矩阵 \mathbf{B} 有四行六列 (4×6)。所以,输出是一个 3×6 的矩阵。
第一行第一列的数字 1019 是怎么得出的?根据矩阵乘法公式,它是矩阵 \mathbf{A} 的第一行与矩阵 \mathbf{B} 的第一列相乘得出的。
因此,你可以计算 A 的第一行和 B 的第一列的点积。点积计算时,首先进行元素乘法,然后对结果求和:
\begin{bmatrix}17&25&6&2\end{bmatrix}\cdot\begin{bmatrix}3&32&19&27\end{bmatrix}
= 17 \times 3 + 25 \times 32 + 6 \times 19 + 2 \times 27
= 1019
看下面的注释,了解详细情况:
如何计算第一行第二列的值?
第一排第二列
SOLUTION:
取 A 的第一行和 B 的第二列,计算点积在下面的视图中,你可以看到如何计算第一行第二列中的值。
我们往后看,这里可以看到如何计算第二排、第四列。你需要矩阵 \mathbf{A} 的第二行和矩阵 \mathbf{B} 的第四列。
继续这个过程,可以得到:
\begin{bmatrix}1019 & 1003 & 97 & 279 & 1208 & 576 \\2001 & 7960 & 408 & 846 & 783 & 1029 \\1927 & 5612 & 357 & 1114 & 3879 & 1121\end{bmatrix}
现在,轮到你用 Python 进行矩阵乘法编码了。
矩阵乘法编程
编写矩阵乘法代码可能非常棘手。你需要分开求解好消息是,矩阵乘法编程是本课程模块最终项目的重要部分。
首先,想想矩阵乘法涉及哪些步骤。你需要将两个矩阵相乘,其大小为
- m x n
- n x p
然后输出大小为 m x p 的矩阵。
在之前的练习中,你已经使用嵌套 for 循环遍历矩阵。那么,如何才能用一个嵌套 for 循环来计算 m×p 矩阵中的每个元素?接下来,在你知道了 A 中必要的行和 B 中必要的列后,如何结合这些值来得到正确答案?
下一页有一个 Ipython Notebook 练习,你可以在其中编写代码。